Code Scrawl
Code Scrawl is a documentation generator. You write .src.md files and call buit-in functions with @verbs() within, including @template(template_name) to load several built-in templates. You can create custom extensions and templates for your own projects, or to generate documentation for using a library you made.
Also generate full API documentation of PHP classes. AST Generation uses taeluf/lexer, which can be extended to support other languages, but as of May 2023, there are no clear plans to do this.
Features
- Integrated AST generation to automatically copy+paste specific parts of source code, thanks to @easy_link(tlf, php/lexer)
- Several builtin verbs and templates
- Extend with custom verbs and templates.
Deprecation Warning:
- v1.0 will stop using hidden directories like
.docsrc/and instead usedocsrc/. The defaults.json file will be changed to accomodate in v1.0 - v1.0 will use dir
src/instead ofcode/as a default directory to scan. (currently also scanstest/, which will not change)
Install
@template(php/composer_install, taeluf/code-scrawl)
Configure
Create a file .config/scrawl.json or scrawl.json in your project root. Defaults:
@file(src/defaults-no-comments.json)
Default Configs / File Structre
Note: Instructions updated to use non-hidden directories, but the default.json file still uses hidden directories. This inconsistency will be fixed in v1.0
-
config/scrawl.json: configuration file -
docsrc/*.src.md: documentation source files (from which your documentation is generated) -
docs/: generated documentation output -
src/*, andtest/*: Code files to scan -
doctemplate/*.md.phpandCodeScrawl/src/Template/*.md.php: re-usable templates -
scrawl-bootstrap.php: Runs at start of$scrawl->run()and$thisis the$scrawlinstance.
Usage
Overview:
- Execute with
vendor/bin/scrawlfrom your project root. - Write files like
docsrc/README.src.md - Use Markdown Verbs (mdverb) to load documentation and code into your
.src.mdfiles:@file(src/defaults.json)would print the content ofsrc/defaults.json - Use the
@templatemdverb to load a template:@template(php/compose_install, taeluf/code-scrawl)to print composer install instructions - Use the
@astmdverb to load code from the AST (Asymmetric Syntax Tree):@ast(class.\Tlf\Scrawl.docblock.description)to print directly or@ast(class.\Tlf\Scrawl, ast/class)to use an ast template. - Write special
@codeverbsin comments in code source files to export docblocks and code. - Extend it! Write custom templates and
@mdverbhandlers - Write custom md verb handlers (see 'Extension' section below)
- Write custom templates (see 'Extension' section below)
- Use an
ASCII Non-Joinercharacter after an@sign, to write a literal@at_sign_with_textand not execute the verb handler.
Write Documents: Example
Write files in your docsrc folder with the extension .src.md.
Example, from @see_file(docsrc/README.src.md)
This would display the ## Install instructions and ## Configure instructions as above
# Code Scrawl
Intro text
## Setup
### Install
@template(php/compose_install, taeluf/code-scrawl)
### Configure
Create a file `.config/scrawl.json` or `scrawl.json` in your project root. Defaults:
```json
@file(src/defaults.json)
```
@MdVerbs List
Write these in your markdown source files for special functionality
@template(Scrawl/MdVerbs)
Template List
Templates can be loaded with @template(template_name, arg1, arg2), except ast/* templates (see below for those).
Each template contains documentation for how to use it & what args it requres. @template(Scrawl/Templates)
@ast() Templates (Asymmetric Syntax Tree)
Example: @ast(class.\Tlf\Scrawl.docblock.description) to print directly or @ast(class.\Tlf\Scrawl, ast/class) to use an ast template.
@CodeVerbs Exports (from code in scan dirs)
In a docblock, write @export(Some.Key) to export everything above it.
In a block of code (or literally anywhere), write // @export_start(Some.Key) then // @export_end(Some.Key) to export everything in between.
See @see_file(test/run/SrcCode.php) for examples
Extensions
Templates: Write a custom template
Look at existing templates in @see_file(doctemplate/) or @see_file(src/Template) for examples.
Verb Handlers: Write a custom verb handler
In your scrawl-bootstrap.php file, do something like:
@file(test/input/run-cli/scrawl-bootstrap.php)
PHP Extensions
Create a class that implements \Tlf\Scrawl\Extension. See file @see_file(src/Extension.php). You can class YourExt extends \Tlf\Scrawl\DoNothingExtension as a base class and then only override the methods you need.
In your config.json, set "ScrawlExtensions": ["Your\\Fully\\Qualified\\ClassName"], with as many extension classes as you like.
Architecture
-
Tlf\Scrawl: Primary class thatrun()s everything. -
\Tlf\Scrawl->run(): generateapi/*files. Load all php classes. scan code files. Scan.src.mdfiles & output.mdfiles.- file set as
file.bootstrapisrequire()d at start ofrun()to setup additional mdverb handlers and (eventually) other extensions. Default isscrawl-bootstrap.php
- file set as
-
Tlf\Scrawl\Ext\MdVerbs: Instantiated duringrun()prior to scanning documentation source files. When an@mdverb(arg1,arg2)is encounter in documentation source file, a handler ($mdverbs->handlers['mdverb']) is called with string arguments like$handler('arg1', 'arg2'). Extend it by adding a callable to$scrawl->mdverb_ext->handlers.-
Tlf\Scrawl\Ext\MdVerb\MainVerbs: Has functions for simple verb handlers like@file,@template. Adds each function as a handler to theMdVerbsclass. -
\Tlf\Scrawl\Ext\MdVerb\Ast: A special mdverb handler that loads ASTs from the lexer and passes it to a named (or default) template.
-
-
Tlf\Scrawl\FileExt\Php: The only AST extension currently active. It is a convenience class that wraps the Lexer so it is easily called byScrawl. It is called to setup ASTs byclass.ClassName...on$scrawl. Call$scrawl->get('ast', 'class.ClassName...'). It is called to generate theapi/*documentation files. - INACTIVE CLASS
Tlf\Scrawl\Ext\Mainsimply copies theproject_root/.docrsc/README.src.mdtoproject_root/README.md -
Tlf\Scrawl\FileExt\ExportDocBlockandExportStartEndhandle the@export()tag in docblocks and the@export_start()/@export_end()tags. -
\Tlf\Scrawl\Utility\DocBlock: Convenience class for extracting docblocks from files. -
\Tlf\Scrawl\Utility\Main: Class with some convenience functions -
\Tlf\Scrawl\Utility\Regex: Class to make regex matching within a file more abstract & object oriented. (it's not particularly good)
More Info
- Run withOUT the cli: Some of the configs require absolute paths when running through php, rather than from the cli. An example is in @see_file(test/run/Integrate.php) under method
testRunFull() -
@literal: Displaying a literal@literalin an md source file can be done by putting a @hard_link(https://unicode-explorer.com/c/200C, Zero Width Non-Joiner) after the arroba (@). You can also use a backslash like so:@\literal, but then the backslash prints - All classes in this repo: @see_file(docs/ClassList.md)
-
$scrawlhas aget/setfeature. In a template, you can get an ast like$scrawl->get('ast.Fully\Qualified\ClassName'). Outside a template, you can use thePhpclass (@see_file(src/Ext/Php.php)) to get an ast from a file or string. - the
deleteExistingDocsconfig has a bit of a sanity check to make sure you don't accidentally delete your whole system or something ...